﻿import * as path from 'path'
import * as url from'url'
import * as fs from 'fs'
import * as crypto from 'crypto'


export function 加载(文件名: string , 选项?: 选项) {
    var 目标文件路径 = path.join(path.parse(文件名).dir, path.basename(文件名, '.js') + '.css')
        var 引用页面路径 = url.parse(window.location.pathname.slice(1)).path
        var APP根路径 = process.cwd()
        var 源代码路径: string = ''
        if (选项) {
            源代码路径 = 文件名.replace('\\' + 选项.输出目录 + '\\', '\\' + 选项.源目录 + '\\')
        } else {
            源代码路径 = 文件名.replace('\输出\\', '\源码\\')
        }
        源代码路径 = path.join(path.parse(源代码路径).dir, path.basename(源代码路径, '.js') + '.css')
        fs.exists(源代码路径, (e) => {
            if (!e) {
                throw new Error("模块不存在")
            } else {
                fs.exists(目标文件路径, (e) => {
                    if (!e) {
                        复制文件(源代码路径, 目标文件路径, () => {
                            生成标签(生成引用相对路径(APP根路径, 引用页面路径, 目标文件路径))
                        })
                    } else {
                        文件对比(源代码路径, 目标文件路径, (原文件路径, 目标文件路径) => {
                            复制文件(源代码路径, 目标文件路径, () => {
                                生成标签(生成引用相对路径(APP根路径, 引用页面路径, 目标文件路径))
                            })
                        }, () => {
                            生成标签(生成引用相对路径(APP根路径, 引用页面路径, 目标文件路径))
                            return
                        })
                    }
                })
            }
        })
}

function 复制文件(原文件路径, 目标文件路径, 复制完成: () => void) {
    var 读 = fs.createReadStream(原文件路径)
    var 写 = fs.createWriteStream(目标文件路径)
    读.pipe(写).on('close', 复制完成)
}

function 文件对比(原文件路径: string, 目标文件路径: string, 不同: (原文件路径: string, 目标文件路径: string) => void, 相同: () => void) {
    var 原: Buffer = null, 目标: Buffer = null
    fs.readFile(原文件路径, (e, d) => {
        if (e) {
            throw e
        } else {
            原 = d
            fs.readFile(目标文件路径, (e, d) => {
                if (e) {
                    不同(原文件路径, 目标文件路径)
                } else {
                    目标 = d
                    if (原 != null && 目标 != null) {
                        var 原MD5 = crypto.createHash('md5').update(原).digest('hex')
                        var 目标MD5 = crypto.createHash('md5').update(目标).digest('hex')
                        if (原MD5 == 目标MD5) {
                            相同()
                        } else {
                            不同(原文件路径, 目标文件路径)
                        }
                    } else {
                        不同(原文件路径, 目标文件路径)
                    }
                }
            })
        }
    })
}

function 生成引用相对路径(根路径: string, 页面路径: string, 文件全路径:string):string {
    var 引用相对路径 = path.relative(
        path.parse(path.relative(
            path.normalize(根路径),
            path.normalize(页面路径))).dir,
        path.relative(
            path.normalize(根路径),
            path.normalize(文件全路径)
        ))
    return 引用相对路径
}

function 生成标签(引用相对路径: string) {
    var link = document.createElement('link')
    link.setAttribute('rel', 'stylesheet');
    link.setAttribute('type', 'text/css');
    link.setAttribute('href', 引用相对路径)
    document.getElementsByTagName('head')[0].appendChild(link)
}

export interface 选项 {
    输出目录: string
    源目录: string
}
